#pragma once

#ifndef XEGE_SYS_BUTTON
#define XEGE_STS_BUTTON

#include "../xege.h"
#include <string>
#include <functional>

namespace xege {

// 必须需要一个可以被访问到的叫做 GMouseMsg 的 mouse_msg 变量
class BUTTON {


private: // private 变量

	// 这个按钮所对应的编号
	unsigned int _UID;
	// 横坐标
	int X;
	// 纵坐标
	int Y;
	// 按钮宽度（并不一定是可见宽度或者是响应宽度
	int Width;
	// 按钮高度（并不一定是可见高度或者是响应高度
	int Height;
	// 是否能够响应事件
	bool enableFlag;
	//           悬停
	xege::PIMAGE Hover;
	//            释放
	xege::PIMAGE Released;
	//            按下
	xege::PIMAGE Pressed;
	//           点击
	xege::PIMAGE Click;
	// 默认函数
	std::function <void(unsigned int)> defaultFunc = [](unsigned id) { return ; };
	// 进入按钮
	std::function <void(unsigned int)> R2H;
	// 离开按钮
	std::function <void(unsigned int)> H2R;
	// 释放按钮
	std::function <void(unsigned int)> P2H;
	// 按下按钮
	std::function <void(unsigned int)> H2P;

private: // private 函数

	// 复制图像
	void CopyImage (xege::PIMAGE Dst, ege::PIMAGE Src);

	// 最大值
	int Max (int a, int b);
	// 最小值
	int Min (int a, int b);
	// 设置默认事件处理函数
	void setDefault (void);
	// 按钮事件（悬停，释放，按下）
	enum BUTTONFLAG { HOVER, RELEASED, PRESSED } lastFlag;
	// 检测鼠标事件
	BUTTONFLAG CheckMouseEvent (xege::mouse_msg _mouse);
	// true for putimage & false for putimage_withalpha
	void showBase (xege::mouse_msg msg, bool _flag = true);

public:
	// 返回一个自增的值，用于找寻按钮
	unsigned int UID ();
	BUTTON (void);
	// create a default button with certain value
	BUTTON (int X, int Y, int Width, int Height);
	// create a button with given IMAGE
	BUTTON (int X, int Y, xege::PIMAGE Hover, xege::PIMAGE Released, xege::PIMAGE Pressed, xege::PIMAGE Click = nullptr);

	// 启用/停用 按钮
	void enable (bool _flag);

	// 设置按钮位置
	void setPos (int x, int y);

	// 设置按钮图像
	void setImage (xege::PIMAGE Hover, xege::PIMAGE Released, xege::PIMAGE Pressed, xege::PIMAGE Click = nullptr);

	void Show (void);
	// 当按钮有透明颜色的时候，请使用这个
	void ShowPNG (void);
	// 当按下返回 true 
	bool isPressed (void);
	// 当释放返回 true
	bool isReleased (void);
	// 当悬浮返回 true
	bool isHover (void);
	// 设置悬浮后按下的处理函数，传入一个参数，当前按钮的 id
	void setH2R (std::function <void(unsigned int id)> func);
	// 设置按下后释放的处理函数，传入一个参数，当前按钮的 id
	void setR2H (std::function <void(unsigned int id)> func);
	// 设置鼠标离开按钮的处理函数，传入一个参数，当前按钮的 id
	void setH2P (std::function <void(unsigned int id)> func);
	// 设置鼠标进入按钮的处理函数，传入一个参数，当前按钮的 id
	void setP2H (std::function <void(unsigned int id)> func);

	~BUTTON ();
};

};

#endif